<?php

namespace app\service\excel;

use Box\Spout\Common\Exception\IOException;
use Box\Spout\Common\Exception\UnsupportedTypeException;
use Dcat\EasyExcel\Excel;

/**
 * Easy Excel是一个基于 box/spout 封装的Excel读写工具，可以帮助开发者更快速更轻松的读写
 * composer require dcat/easy-excel
 * 文档地址: https://jqhph.github.io/easy-excel/docs/master/installation.html
 */
class EasyExcelService
{
    /**
     * Exporter::download方法可以通过浏览器下载导出的文件，该方法会根据文件名后缀自动判断
     * @param array $data
     * @param array $headings $headings = ['id'    => 'ID','email' => '邮箱','name'  => '名称'];
     * @param string $file_name
     * @param string $type
     * @return true
     */
    public static function download(array $data,string $file_name,array $headings=[],string $type="xlsx"): bool
    {
        if (empty($headings)){
            $headings = false;
        }
        Excel::export($data)->headings($headings)->download($file_name);
        switch ($type){
            case "csv":
                // 导出csv类型文件
                Excel::xlsx($data)->headings($headings)->download($file_name);
                break;
            case "ods":
                Excel::csv($data)->headings($headings)->download($file_name);
                break;
            // 导出ods类型文件
            default:
                // 导出xlsx类型文件
                Excel::export($data)->headings($headings)->download($file_name);
                break;
        }
        return true;
    }

    /**
     * Exporter::store方法可以保存导出的文件到服务器，该方法会根据文件名后缀自动判断导出的文件类型。
     * @param array $data
     * @param array $headings
     * @param string $file_name
     * @param string $type
     * @return true
     */
    public static function downloadStore(array $data,string $file_name,array $headings=[],string $type="xlsx"): bool
    {
        if (empty($headings)){
            $headings = false;
        }
        Excel::export($data)->headings($headings)->store($file_name);
        switch ($type){
            case "csv":
                // 导出csv类型文件
                Excel::xlsx($data)->headings($headings)->store($file_name);
                break;
            case "ods":
                Excel::csv($data)->headings($headings)->store($file_name);
                break;
            // 导出ods类型文件
            default:
                // 导出xlsx类型文件
                Excel::export($data)->headings($headings)->store($file_name);
                break;
        }
        return true;
    }

    /**
     * 数组方式的数据
     * @param array $sheets $sheets = ['sheet名称1' => $sheetArray1,'sheet名称2' => $sheetArray2];
     * @param array $headings
     * @param string $file_name
     * @return bool
     */
    public static function downloadMultipleTables(array $sheets,string $file_name,array $headings=[]): bool
    {
        if (empty($headings)){
            $headings = false;
        }
        return Excel::export($sheets)->headings($headings)->store($file_name);
    }


    /**
     * 读取Excel指定标题所在的行的数据
     * @param string $file_name 上传的文件路径
     * @param int $headingRow 指定第X行为标题行
     * @param array $headings 标题 ['id', 'email', 'name']
     * @return array
     * @throws IOException
     * @throws UnsupportedTypeException
     */
    public function getCertainRow(string $file_name,int $headingRow=0,array $headings=[]): array
    {
        if (empty($headings)){
            $headings = false;
        }
        $allSheets = Excel::import($file_name)
            ->headings($headings);
        if ($headingRow>0){
            $allSheets->headingRow($headingRow);
        }
        return $allSheets ->toArray();
    }

}
